package com.blog.cmrpersonalblog.dto.announcement.request;

import com.blog.cmrpersonalblog.common.BasePageRequest;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.Max;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

/**
 * 公告查询请求DTO
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class AnnouncementQueryRequest extends BasePageRequest {

    /**
     * 公告标题（模糊查询）
     */
    private String title;

    /**
     * 公告类型 1-系统公告 2-活动公告 3-维护公告 4-其他
     */
    @Min(value = 1, message = "公告类型最小值为1")
    @Max(value = 4, message = "公告类型最大值为4")
    private Integer type;

    /**
     * 公告级别 1-普通 2-重要 3-紧急
     */
    @Min(value = 1, message = "公告级别最小值为1")
    @Max(value = 3, message = "公告级别最大值为3")
    private Integer level;

    /**
     * 公告状态 0-草稿 1-已发布 2-已过期 3-已删除
     */
    @Min(value = 0, message = "公告状态最小值为0")
    @Max(value = 3, message = "公告状态最大值为3")
    private Integer status;

    /**
     * 是否置顶 0-否 1-是
     */
    private Integer isTop;

    /**
     * 目标受众
     */
    private String targetAudience;

    /**
     * 创建人ID
     */
    private Long creatorId;

    /**
     * 发布开始时间
     */
    private LocalDateTime publishStartTime;

    /**
     * 发布结束时间
     */
    private LocalDateTime publishEndTime;

    /**
     * 创建开始时间
     */
    private LocalDateTime createStartTime;

    /**
     * 创建结束时间
     */
    private LocalDateTime createEndTime;

    /**
     * 是否只查询有效公告（未过期且已发布）
     */
    private Boolean onlyValid;

    /**
     * 是否只查询置顶公告
     */
    private Boolean onlyTop;

    /**
     * 构造函数，设置默认排序
     */
    public AnnouncementQueryRequest() {
        super();
        setDefaultSort("id", "asc");
    }

    /**
     * 获取允许的排序字段列表
     */
    public List<String> getAllowedSortFields() {
        return Arrays.asList(
            "id", "title", "type", "level", "status",
            "is_top", "publish_time", "expire_time",
            "view_count", "create_time", "update_time"
        );
    }

    /**
     * 验证排序字段是否合法
     */
    public boolean isValidSortField(String sortField) {
        return getAllowedSortFields().contains(sortField);
    }
}
